package com.wg.core.serialize;

/**
 * 序列化接口
 *
 * <p>
 * 定义了对象的序列化和反序列化方法，以及序列化类型标识。
 * 实现该接口的类可以支持不同的序列化算法，如JSON、Kryo、Hessian等。
 * </p>
 *
 * @author 少爷123
 */
public interface ISerializer {
    /**
     * 序列化对象为字节数组
     *
     * @param obj 待序列化的对象
     * @return 序列化后的字节数组
     * @throws Exception 序列化过程中可能抛出的异常
     */
    byte[] serialize(Object obj) throws Exception;

    /**
     * 反序列化字节数组为对象
     *
     * <p>
     * 该方法根据指定的字节数组和目标对象类型进行反序列化操作。
     * 实现类需要根据序列化类型标识判断使用哪种反序列化算法。
     * </p>
     *
     * @param data  序列化后的字节数组
     * @param clazz 目标对象类型
     * @return 反序列化后的对象
     * @throws Exception 反序列化过程中可能抛出的异常
     */
    <T> T deserialize(byte[] data, Class<T> clazz) throws Exception;

    /**
     * 序列化类型标识，用于网络传输时区分序列化方式
     *
     * <p>
     * 不同的序列化器可以使用不同的类型标识，用于在网络传输中识别使用哪种序列化算法。
     * </p>
     *
     * @return 序列化类型标识
     */
    int getType();
}
